package com.itheima.springbootwebtlias.controller;

import com.itheima.springbootwebtlias.pojo.Dept;
import com.itheima.springbootwebtlias.pojo.Result;
import com.itheima.springbootwebtlias.service.DeptService;
import com.itheima.springbootwebtlias.util.JwtUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 部门处理器：处理部门相关请求
 */

/**
 * @RequestMapping
 * 作用：设置请求路径
 * 位置：方法上，类上
 * 处理器类中： 一个完整的请求路径是 处理器类上的路径 + 方法上的路径
 */

@Slf4j
@RequestMapping("/depts")  //处理器类中：一个完整的请求路径是 处理器类上的路径 + 方法上的路径  （下面的depts可以不写）
@RestController
public class DeptController {

//    //创建日志对象Logger
//    private static final Logger log = LoggerFactory.getLogger(DeptController.class);

    @Autowired
    private DeptService deptService;

    //查询所有部门列表的处理器方法
//    @RequestMapping(value = "/depts" , method = RequestMethod.GET)
    @GetMapping//表示该方法处理器请求地址为/dept的GET请求
//    @RequestMapping("/depts",method = RequestMethod.GET)
    public Result QueryAll(HttpServletRequest request, HttpServletResponse response){
        //校验令牌
        String  token = request.getHeader("token");
        if(token == null){
            response.setStatus(401);
        }
        try {
            JwtUtils.parseJWT(token);
        }catch (Exception e){
            response.setStatus(401);
        }
        //1.接收请求参数：无
        log.info("查询所有部门列表，请求参数：无");

        //2.调用业务层Service的功能方法，查询部门列表
        List<Dept> depts = deptService.selectAll();
        log.info("查询所有部门列表，查询完毕：{}",depts);

        //3.封装响应结果：
        return Result.success(depts);
    }

    //删除指定部门处理器方法

    //删除指定部门处理器方法
//    @DeleteMapping("/depts")
//    public Result removeById(HttpServletRequest request,@RequestParam(value = "id" ,required = true,defaultValue = "10") Integer id2 ,Dept dept,@RequestParam Map map){
//        //1.接收请求参数 k = v
//        //方式一：原始的方法HttpServletRequest对象获取请求参数
//        String idStr = request.getParameter("id");
//        int id = Integer.parseInt(idStr);
//        System.out.println("HttpServletRequest接收参数"+id);
//
//        //方式二：框架，直接定义变量接收 （请求参数数量 较少）
//        System.out.println("定义变量接受参数"+id2);
//
//        //方式三：框架，直接定义对象接受（请求参数数量较多 ）
//        System.out.println("定义对象接收参数"+dept);
//
//        //方式四：框架，定义Map对象接收(请求参数数量较多 + 没有现成的实体对象，不想单独创建实体对象接受  注意：@RequestParam 标识使用当前集合接收请求参数)
//        System.out.println("定义Map对象接受参数"+map.get("id"));
//
//        //2.调用业务层Service的功能方法，删除指定部门
//
//        //3.封装响应结果
//        return  null;
//    }

    //删除指定部门处理器方法
//    @RequestMapping(value = "/depts" , method = RequestMethod.DELETE)
    @DeleteMapping
    public Result removeById( Integer id){
        //1.接收请求参数 k = v
        //直接定义变量接受，变量名称= 参数名称一致
        log.info("删除指定部门，请求参数：{}",id);

        //2.调用业务层Service的功能方法，删除指定部门
        deptService.removeById(id); //DML不需要返回值
        log.info("删除指定部门，删除完毕");

        //3.封装响应结果
        return  Result.success();  //code=1,data=null,msg="success"
    }

    //添加部门处理器方法
    @PostMapping
    public Result save(@RequestBody Dept dept){
        //1.接收请求参数 ：json(请求体中)
        //json接收参数: @RequestBody + 定义实体对象 /Map对象
        log.info("添加部门，请求参数：{}",dept);

        //2.调用业务层Service的功能方法，添加部门
        deptService.saveDept(dept);
        log.info("添加部门，添加完毕");

        //3.封装响应结果
        return Result.success(); //code=1,data=null,msg="success"
    }

    //根据id查询部门处理器方法

    //根据id查询部门处理器方法
//    @GetMapping("/depts/{id}/{name}")
//    public Result findById(@PathVariable int id,@PathVariable String name){
//        //1.接收请求参数：path路径参数，作为请求路径的一部分
//        //请求路径参数接收方式，@PathVariable(路径变量) 定义变量
//        System.out.println("接收请求参数"+id);
//        System.out.println("接收请求参数"+name);
//        //2.调用业务层Service的功能方法，查询指定部门
//
//        //3.封装响应结果
//
//        return null;
//    }

    //根据id查询部门处理器方法
    @GetMapping("{id}")
    public Result findById(@PathVariable int id){
        //1.接收请求参数：path路径参数，作为请求路径的一部分
        //请求路径参数接收方式，@PathVariable(路径变量) 定义变量
        log.info("根据id查询部门，请求参数：{}",id);

        //2.调用业务层Service的功能方法，查询指定部门
        Dept dept =deptService.findById(id);
        log.info("根据id查询部门，查询完毕：{}",dept);

        //3.封装响应结果

        return Result.success(dept); //code=1,data=查询到的部门详情信息,msg="success"
    }

    //修改部门处理器方法
    @PutMapping
    public Result update(@RequestBody Dept dept){

        //1.接收请求参数：json(请求体中)
        //JSON格式参数：@RequestBody + 定义实体对象 /Map对象
        log.info("修改部门，请求参数{}：",dept);

        //2.调用业务层Service的功能方法，修改部门
        deptService.update(dept);
        log.info("修改部门，修改完毕");

        //3.封装响应结果
        return Result.success();
    }
}
